package edu.upc.bolsatrabajo.model.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import edu.upc.bolsatrabajo.model.domain.Usuario;
import edu.upc.bolsatrabajo.model.iface.IUsuario;

@Repository
public class UsuarioImpl implements IUsuario {

	@Autowired
	private DataSource dataSource;

	Connection connection = null;
	PreparedStatement statement = null;
	ResultSet resultSet = null;

	public List<Usuario> listarUsuarios(Usuario oUsuario) {
		List<Usuario> Usuarios = new ArrayList<Usuario>();

		String sqlListarUsuarios = "SELECT * FROM TAB_USUARIO";

		try {
			connection = dataSource.getConnection();
			statement = connection.prepareStatement(sqlListarUsuarios);
			resultSet = statement.executeQuery(sqlListarUsuarios);

			while (resultSet.next()) {
				//oUsuario = null;
				oUsuario.setPassword(resultSet.getString("C_TITULO_ANUNCIO"));
				Usuarios.add(oUsuario);
			}

		} catch (Exception e) {
			throw new RuntimeException(
					"SQL exception occurred finding Usuario", e);
		} finally {
			if (resultSet != null) {
				try {
					// Close to prevent database cursor exhaustion
					resultSet.close();
				} catch (SQLException ex) {
				}
			}
			if (statement != null) {
				try {
					// Close to prevent database cursor exhaustion
					statement.close();
				} catch (SQLException ex) {
				}
			}
			if (connection != null) {
				try {
					// Close to prevent database connection exhaustion
					connection.close();
				} catch (SQLException ex) {
				}
			}
		}

		return Usuarios;
	}

	public Usuario obtenerUsuario(Usuario oUsuario) {
		// TODO Auto-generated method stub
		return null;
	}

	public int insertarUsuario(Usuario oUsuario) {

		int respuesta = 0;
		String sqlInsertarUsuario = "INSERT INTO TAB_USUARIO " +
				" (C_NOMBRE_USUARIO, C_CLAVE, D_FECHA_INSCRIPCION, N_TIPO_USUARIO) " +
				" VALUES (?,?,?,?)";

		try {
			connection = dataSource.getConnection();
			statement = connection.prepareStatement(sqlInsertarUsuario);
			statement.setString(1, oUsuario.getNombreUsuario());
			statement.setString(2, oUsuario.getPassword());
			statement.setDate(3, oUsuario.getFechaInscripcion());
			statement.setInt(4, oUsuario.getTipoUsuario().getCodigo());
			statement.executeUpdate();
			
			respuesta = 1;

		} catch (Exception e) {
			throw new RuntimeException("SQL exception occurred finding Usuario", e); 
			//e.printStackTrace();
		} finally {
			if (resultSet != null) {
				try {
					// Close to prevent database cursor exhaustion
					resultSet.close();
				} catch (SQLException ex) {
				}
			}
			if (statement != null) {
				try {
					// Close to prevent database cursor exhaustion
					statement.close();
				} catch (SQLException ex) {
				}
			}
			if (connection != null) {
				try {
					// Close to prevent database connection exhaustion
					connection.close();
				} catch (SQLException ex) {
				}
			}
		}
		return respuesta;
	}

	public int actualizarUsuario(Usuario oUsuario) {

		int respuesta = 0;
		String sqlActualizarUsuarios = "UPDATE TAB_Usuario SET " +
				"(C_NOMBRES, C_APELLIDO_PATERNO, C_APELLIDO_MATERNO) " +
				" = (?,?,?) WHERE N_CODIGO_Usuario = ?";

		try {
			connection = dataSource.getConnection();
			statement = connection.prepareStatement(sqlActualizarUsuarios);
			statement.executeQuery(sqlActualizarUsuarios);
			
			respuesta = 1;

		} catch (Exception e) {
			throw new RuntimeException("SQL exception occurred finding Usuario", e); 
			
		} finally {
			if (resultSet != null) {
				try {
					// Close to prevent database cursor exhaustion
					resultSet.close();
				} catch (SQLException ex) {
				}
			}
			if (statement != null) {
				try {
					// Close to prevent database cursor exhaustion
					statement.close();
				} catch (SQLException ex) {
				}
			}
			if (connection != null) {
				try {
					// Close to prevent database connection exhaustion
					connection.close();
				} catch (SQLException ex) {
				}
			}
		}
		return respuesta;
	}

	public int eliminarUsuario(Usuario oUsuario) {

		int respuesta = 0;
		String sqlEliminarUsuario = "DELETE FROM TAB_Usuario WHERE " +
				" N_CODIGO_Usuario = ? ";

		try {
			connection = dataSource.getConnection();
			statement = connection.prepareStatement(sqlEliminarUsuario);
			statement.executeQuery(sqlEliminarUsuario);
			
			respuesta = 1;

		} catch (Exception e) {
			throw new RuntimeException("SQL exception occurred finding Usuario", e); 
			
		} finally {
			if (resultSet != null) {
				try {
					// Close to prevent database cursor exhaustion
					resultSet.close();
				} catch (SQLException ex) {
				}
			}
			if (statement != null) {
				try {
					// Close to prevent database cursor exhaustion
					statement.close();
				} catch (SQLException ex) {
				}
			}
			if (connection != null) {
				try {
					// Close to prevent database connection exhaustion
					connection.close();
				} catch (SQLException ex) {
				}
			}
		}
		return respuesta;
	}



}